package jp.ac.u_tokyo.dch.service;

import java.util.ArrayList;
import java.util.List;

import jp.ac.u_tokyo.dch.core.db.DBConnection;
import jp.ac.u_tokyo.dch.core.exceptions.DBException;
import jp.ac.u_tokyo.dch.dao.data.DataDao;
import jp.ac.u_tokyo.dch.dao.front.FrontDisplayGroupDao;
import jp.ac.u_tokyo.dch.dao.front.GroupItemsDao;
import jp.ac.u_tokyo.dch.dao.front.TreeMenuDao;
import jp.ac.u_tokyo.dch.model.db.GroupItems;
import jp.ac.u_tokyo.dch.model.xml.tree.Entry;
import jp.ac.u_tokyo.dch.model.xml.tree.FrontTree;
import jp.ac.u_tokyo.dch.model.xml.tree.TreeData;
import jp.ac.u_tokyo.dch.model.xml.tree.TreeEntry;
import jp.ac.u_tokyo.dch.util.XmlCommonUtil;
/**
 * @version 1.1
 */
public class TreeService {

	/**
	 * DBコネクションオブジェクト
	 */
	private DBConnection dbconn = null;

	/**
	 * オブジェクト生成者
	 * @param dbconn
	 */
	public TreeService(DBConnection dbconn){
		this.dbconn = dbconn;
	}

	/**
	 * ツリーデータを生成する
	 * @throws Exception 例外
	 */
	public void makeTree() throws Exception {

		FrontTree tree = makeFrontTree();
		TreeMenuDao treeMenuDao = new TreeMenuDao(dbconn);

		String treeXml = XmlCommonUtil.ObjectToXml(tree);
		treeMenuDao.insert(treeXml);
	}

	/**
	 * ツリーデータを生成する
	 * @param groupid グループID
	 * @throws Exception 例外
	 */
	public void makeTree(String groupid) throws Exception {

		List<Entry> treeList = makeFrontTree(groupid);
		TreeMenuDao treeMenuDao = new TreeMenuDao(dbconn);

		treeMenuDao.insert(treeList);
	}


	/**
	 * ツリーを生成する
	 * @param groupid グループID
	 * @return ツリーオブジェクト
	 * @throws DBException 例外
	 */
	private List<Entry> makeFrontTree(String groupid) throws DBException {

		FrontDisplayGroupDao frontDisplayGroupDao = new FrontDisplayGroupDao(dbconn);
		GroupItemsDao groupItemsDao = new GroupItemsDao(dbconn);
		DataDao dataDao = new DataDao(dbconn);
		List<Entry> entryList = new ArrayList<Entry>();

		List<GroupItems> list = groupItemsDao.selectList(groupid);

		for (GroupItems item : list) {

			String displayName = item.getDisplayName();
			List<String> fieldList = item.toFieldKeyList();

			Entry entry = new TreeEntry(displayName);

			List<List<TreeData>> treelist = frontDisplayGroupDao.selectGroupData(fieldList);

			for (List<TreeData> treeData : treelist) {

				entry.addData(0, treeData);
			}

			entryList.add(entry);
		}
		List<List<TreeData>> allDatatreelist = dataDao.selectSearchAll();
		Entry allEntry = new TreeEntry("全データ");

		for (List<TreeData> allData : allDatatreelist) {

			allEntry.addData(0, allData);
		}
		entryList.add(allEntry);
		return entryList;
	}
	/**
	 * ツリーを生成する
	 * @return ツリーオブジェクト
	 * @throws DBException 例外
	 */
	private FrontTree makeFrontTree() throws DBException {

		FrontTree frontTree = new FrontTree();

//		frontTree.setLabel("収蔵資料一覧");
//
//		FrontDisplayGroupDao frontDisplayGroupDao = new FrontDisplayGroupDao(dbconn);
//		DataDao dataDao = new DataDao(dbconn);
//		DataDetailDao dataDetailDao = new DataDetailDao(dbconn);
//
//		List<Gdata> lv1TreeList = new ArrayList<Gdata>();
//
//		frontTree.setList(lv1TreeList);
//
//		List<GroupItems> groupItems = frontDisplayGroupDao.selectMaxList();
//
//		for (GroupItems groupItem : groupItems) {
//
//			Gdata lv1 = new Gdata();
//
//			String fieldKey = groupItem.getFieldKey();
//
//			lv1.setLabel(groupItem.getDisplayName());
//
//			List<Gdata> lv2TreeList = new ArrayList<Gdata>();
//
//			List<DataDetail> detailList = dataDetailDao.selectGroupByField(fieldKey);
//
//			for (DataDetail detail : detailList) {
//
//				Gdata lv2 = new Gdata();
//
//				lv2.setLabel(detail.getDbData());
//				List<Rdata> dataList = dataDao.selectSearchByFieldKey(detail.getFieldKey(), detail.getDbData());
//				lv2.setRdataList(dataList);
//
//				lv2TreeList.add(lv2);
//			}
//			lv1.setGdataList(lv2TreeList);
//
//			lv1TreeList.add(lv1);
//		}
//
//		List<Rdata> alldataList = dataDao.selectSearchAll();
//
//		Gdata allData = new Gdata();
//
//		allData.setLabel("全データ");
//		allData.setRdataList(alldataList);
//		lv1TreeList.add(allData);

		return frontTree;

	}


}
